//package org.csu.mypetstore.api.utils.encrypt;
//
//import lombok.extern.slf4j.Slf4j;
//import org.apache.ibatis.executor.resultset.ResultSetHandler;
//import org.apache.ibatis.plugin.*;
//import org.csu.mypetstore.api.utils.encrypt.annotation.SensitiveData;
//import org.springframework.core.annotation.AnnotationUtils;
//import org.springframework.stereotype.Component;
//
//import java.beans.Statement;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Objects;
//import java.util.Properties;
//
//@Slf4j
//@Component
//@Intercepts({
//        @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = Statement.class)
//})
//public class DecryptInterceptor implements Interceptor {
//    @Override
//    public Object intercept(Invocation invocation) throws Throwable {
//        Object resultObject = invocation.proceed();
//        try {
//            if (Objects.isNull(resultObject)) {
//                return null;
//            }
//            if (resultObject instanceof ArrayList) {
//                // 基于selectList
//                List resultList = (ArrayList) resultObject;
//                if (!resultList.isEmpty() && needToDecrypt(resultList.get(0))) {
//                    for (Object result : resultList) {
//                        //逐一解密
//                        decrypt(result);
//                    }
//                }
//            } else {
//                // 基于selectOne
//                if (needToDecrypt(resultObject)) {
//                    EncryptUtils.decrypt((String) resultObject);
//                }
//            }
//            return resultObject;
//        } catch (Exception e) {
//            log.error("解密失败", e);
//        }
//        return resultObject;
//    }
//
//    private boolean needToDecrypt(Object object) {
//        Class<?> objectClass = object.getClass();
//        SensitiveData sensitiveData = AnnotationUtils.findAnnotation(objectClass, SensitiveData.class);
//        return Objects.nonNull(sensitiveData);
//    }
//
//    @Override
//    public Object plugin(Object target) {
//        // 将这个拦截器接入拦截器链
//        return Plugin.wrap(target, this);
//    }
//
//    @Override
//    public void setProperties(Properties properties) { }
//
//    private <T> T decrypt() {
//
//    }
//}
